home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / vim_src.zip / DIGRAPH.C < prev    next >
C/C++ Source or Header  |  1993-01-12  |  5KB  |  252 lines

  1. /* vi:ts=4:sw=4
  2.  *
  3.  * VIM - Vi IMitation
  4.  *
  5.  * Code Contributions By:    Bram Moolenaar            mool@oce.nl
  6.  *                            Tim Thompson            twitch!tjt
  7.  *                            Tony Andrews            onecom!wldrdg!tony 
  8.  *                            G. R. (Fred) Walter        watmath!watcgl!grwalter 
  9.  */
  10.  
  11. #ifdef DIGRAPHS
  12. /*
  13.  * digraph.c: code for digraphs
  14.  */
  15.  
  16. #include "vim.h"
  17. #include "globals.h"
  18. #include "proto.h"
  19.  
  20. static void printdigraph __ARGS((u_char *));
  21.  
  22. u_char    (*digraphnew)[3];            /* pointer to added digraphs */
  23. int        digraphcount = 0;            /* number of added digraphs */
  24.  
  25. u_char    digraphdefault[][3] =         /* standard digraphs */
  26.        {'~', '!', 161,    /* í */
  27.         'c', '|', 162,    /* ó */
  28.         '$', '$', 163,    /* ú */
  29.         'o', 'x', 164,    /* ñ */
  30.         'Y', '-', 165,    /* Ñ */
  31.         '|', '|', 166,    /* ª */
  32.         'p', 'a', 167,    /* º */
  33.         '"', '"', 168,    /* ¿ */
  34.         'c', 'O', 169,    /* ⌐ */
  35.         'a', '-', 170,    /* ¬ */
  36.         '<', '<', 171,    /* ½ */
  37.         'a', '-', 172,    /* ¼ */
  38.         '-', '-', 173,    /* ¡ */
  39.         'r', 'O', 174,    /* « */
  40.         '-', '=', 175,    /* » */
  41.         '~', 'o', 176,    /* ░ */
  42.         '+', '-', 177,    /* ▒ */
  43.         '2', '2', 178,    /* ▓ */
  44.         '3', '3', 179,    /* │ */
  45.         '\'', '\'', 180,    /* ┤ */
  46.         'j', 'u', 181,    /* ╡ */
  47.         'p', 'p', 182,    /* ╢ */
  48.         '~', '.', 183,    /* ╖ */
  49.         ',', ',', 184,    /* ╕ */
  50.         '1', '1', 185,    /* ╣ */
  51.         'o', '-', 186,    /* ║ */
  52.         '>', '>', 187,    /* ╗ */
  53.         '1', '4', 188,    /* ╝ */
  54.         '1', '2', 189,    /* ╜ */
  55.         '3', '4', 190,    /* ╛ */
  56.         '~', '?', 191,    /* ┐ */
  57.         'A', '`', 192,    /* └ */
  58.         'A', '\'', 193,    /* ┴ */
  59.         'A', '^', 194,    /* ┬ */
  60.         'A', '~', 195,    /* ├ */
  61.         'A', '"', 196,    /* ─ */
  62.         'A', '@', 197,    /* ┼ */
  63.         'A', 'E', 198,    /* ╞ */
  64.         'C', ',', 199,    /* ╟ */
  65.         'E', '`', 200,    /* ╚ */
  66.         'E', '\'', 201,    /* ╔ */
  67.         'E', '^', 202,    /* ╩ */
  68.         'E', '"', 203,    /* ╦ */
  69.         'I', '`', 204,    /* ╠ */
  70.         'I', '\'', 205,    /* ═ */
  71.         'I', '^', 206,    /* ╬ */
  72.         'I', '"', 207,    /* ╧ */
  73.         '-', 'D', 208,    /* ╨ */
  74.         'N', '~', 209,    /* ╤ */
  75.         'O', '`', 210,    /* ╥ */
  76.         'O', '\'', 211,    /* ╙ */
  77.         'O', '^', 212,    /* ╘ */
  78.         'O', '~', 213,    /* ╒ */
  79.         'O', '"', 214,    /* ╓ */
  80.         '/', '\\', 215,    /* ╫ */
  81.         'O', '/', 216,    /* ╪ */
  82.         'U', '`', 217,    /* ┘ */
  83.         'U', '\'', 218,    /* ┌ */
  84.         'U', '^', 219,    /* █ */
  85.         'U', '"', 220,    /* ▄ */
  86.         'Y', '\'', 221,    /* ▌ */
  87.         'I', 'p', 222,    /* ▐ */
  88.         's', 's', 223,    /* ▀ */
  89.         'a', '`', 224,    /* α */
  90.         'a', '\'', 225,    /* ß */
  91.         'a', '^', 226,    /* Γ */
  92.         'a', '~', 227,    /* π */
  93.         'a', '"', 228,    /* Σ */
  94.         'a', '@', 229,    /* σ */
  95.         'a', 'e', 230,    /* µ */
  96.         'c', ',', 231,    /* τ */
  97.         'e', '`', 232,    /* Φ */
  98.         'e', '\'', 233,    /* Θ */
  99.         'e', '^', 234,    /* Ω */
  100.         'e', '"', 235,    /* δ */
  101.         'i', '`', 236,    /* ∞ */
  102.         'i', '\'', 237,    /* φ */
  103.         'i', '^', 238,    /* ε */
  104.         'i', '"', 239,    /* ∩ */
  105.         '-', 'd', 240,    /* ≡ */
  106.         'n', '~', 241,    /* ± */
  107.         'o', '`', 242,    /* ≥ */
  108.         'o', '\'', 243,    /* ≤ */
  109.         'o', '^', 244,    /* ⌠ */
  110.         'o', '~', 245,    /* ⌡ */
  111.         'o', '"', 246,    /* ÷ */
  112.         ':', '-', 247,    /* ≈ */
  113.         'o', '/', 248,    /* ° */
  114.         'u', '`', 249,    /* ∙ */
  115.         'u', '\'', 250,    /* · */
  116.         'u', '^', 251,    /* √ */
  117.         'u', '"', 252,    /* ⁿ */
  118.         'y', '\'', 253,    /* ² */
  119.         'i', 'p', 254,    /* ■ */
  120.         'y', '"', 255,    /*   */
  121.         NUL, NUL, NUL
  122.         };
  123.  
  124. /*
  125.  * lookup the pair char1, char2 in the digraph tables
  126.  * if no match, return char2
  127.  */
  128.     int
  129. getdigraph(char1, char2)
  130.     int    char1;
  131.     int    char2;
  132. {
  133.     int        i;
  134.     int        retval;
  135.  
  136.     retval = 0;
  137.     for (i = 0; ; ++i)            /* search added digraphs first */
  138.     {
  139.         if (i == digraphcount)    /* end of added table, search defaults */
  140.         {
  141.             for (i = 0; digraphdefault[i][0] != 0; ++i)
  142.                 if (digraphdefault[i][0] == char1 && digraphdefault[i][1] == char2)
  143.                 {
  144.                     retval = digraphdefault[i][2];
  145.                     break;
  146.                 }
  147.             break;
  148.         }
  149.         if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  150.         {
  151.             retval = digraphnew[i][2];
  152.             break;
  153.         }
  154.     }
  155.  
  156.     if (retval == 0)    /* digraph deleted or not found */
  157.         return char2;
  158.     return retval;
  159. }
  160.  
  161. /*
  162.  * put the digraphs in the argument string in the digraph table
  163.  * format: {c1}{c2} char {c1}{c2} char ...
  164.  */
  165.     void
  166. putdigraph(str)
  167.     char *str;
  168. {
  169.     int        char1, char2, n;
  170.     u_char    (*newtab)[3];
  171.     int        i;
  172.  
  173.     while (*str)
  174.     {
  175.         skipspace(&str);
  176.         char1 = *str++;
  177.         char2 = *str++;
  178.         if (char1 == 0 || char2 == 0)
  179.             return;
  180.         skipspace(&str);
  181.         if (!isdigit(*str))
  182.         {
  183.             emsg(e_number);
  184.             return;
  185.         }
  186.         n = getdigits(&str);
  187.         if (digraphnew)        /* search the table for existing entry */
  188.         {
  189.             for (i = 0; i < digraphcount; ++i)
  190.                 if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  191.                 {
  192.                     digraphnew[i][2] = n;
  193.                     break;
  194.                 }
  195.             if (i < digraphcount)
  196.                 continue;
  197.         }
  198.         newtab = (u_char (*)[3])alloc(digraphcount * 3 + 3);
  199.         if (newtab)
  200.         {
  201.             memmove(newtab, digraphnew, (size_t)(digraphcount * 3));
  202.             free(digraphnew);
  203.             digraphnew = newtab;
  204.             digraphnew[digraphcount][0] = char1;
  205.             digraphnew[digraphcount][1] = char2;
  206.             digraphnew[digraphcount][2] = n;
  207.             ++digraphcount;
  208.         }
  209.     }
  210. }
  211.  
  212.     void
  213. listdigraphs()
  214. {
  215.     int        i;
  216.  
  217.     printdigraph(NULL);
  218.     for (i = 0; digraphdefault[i][0]; ++i)
  219.         if (getdigraph(digraphdefault[i][0], digraphdefault[i][1]) == digraphdefault[i][2])
  220.             printdigraph(digraphdefault[i]);
  221.     for (i = 0; i < digraphcount; ++i)
  222.         printdigraph(digraphnew[i]);
  223.     outchar('\n');
  224.     wait_return(TRUE);
  225. }
  226.  
  227.     static void
  228. printdigraph(p)
  229.     u_char *p;
  230. {
  231.     char        buf[9];
  232.     static int    len;
  233.  
  234.     if (p == NULL)
  235.         len = 0;
  236.     else if (p[2] != 0)
  237.     {
  238.         if (len > Columns - 11)
  239.         {
  240.             outchar('\n');
  241.             len = 0;
  242.         }
  243.         if (len)
  244.             outstrn("   ");
  245.         sprintf(buf, "%c%c %c %3d", p[0], p[1], p[2], p[2]);
  246.         outstrn(buf);
  247.         len += 11;
  248.     }
  249. }
  250.  
  251. #endif /* DIGRAPHS */
  252.